package com.itheima.security.springmvc.service;

import com.itheima.security.springmvc.model.AuthenticationRequest;
import com.itheima.security.springmvc.model.UserDto;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * @author xiaoxiaokui
 * @description: AuthenticationServiceImpl
 * @date 2019/11/18
 **/
@Service
public class AuthenticationServiceImpl implements AuthenticationService {

    /**
     * @description 用户认证，校验用户信息是否合法
     * @author xiaoxiaokui
     * @date 2019/11/18
     * @param authenticationRequest
     * @return com.itheima.security.springmvc.model.UserDto
     * @modifier
     * @note
     **/
    @Override
    public UserDto authentication(AuthenticationRequest authenticationRequest) {
        // 校验参数是否为空
        if(authenticationRequest == null
                || StringUtils.isEmpty(authenticationRequest.getUsername())
                || StringUtils.isEmpty(authenticationRequest.getPassword())) {
             throw new RuntimeException("账号或密码为空");
        }
        // 根据账号查询数据库，采用模拟方法
        UserDto user = this.getUserDto(authenticationRequest.getUsername());
        // 判断用户是否为空
        if (user == null) {
            throw new RuntimeException("查询不到用户");
        }
        // 校验密码
        if (!authenticationRequest.getPassword().equals(user.getPassword())) {
            throw new RuntimeException("账号或密码错误");
        }
        // 认证通过返回用户信息
        return user;
    }
    
    /**
     * @description 根据账号查询用户信息
     * @author xiaoxiaokui 
     * @date 2019/11/18
     * @param [userName]
     * @return userDto
     * @modifier
     * @note
     **/
    private UserDto getUserDto(String userName) {
        return userMap.get(userName);
    }

    /**
     * 用户信息
     */
    private Map<String, UserDto> userMap = new HashMap<>();
    {
        Set<String> authorities1 = new HashSet<>();
        // 这个p1我们人为让它和/r/r1对应
        authorities1.add("p1");
        Set<String> authorities2 = new HashSet<>();
        // 这个p2我们人为让它和/r/r2对应
        authorities2.add("p2");
        userMap.put("zhangsan", new UserDto("1010", "zhangsan", "123", "张三", "133443", authorities1));
        userMap.put("lisi", new UserDto("1011", "lisi", "456", "李四", "144553", authorities2));
    }
}
